#ifndef MYJSON_H
#define MYJSON_H

#include <QFile>
#include <QJsonArray>
#include <QJsonObject>
#include <QJsonParseError>
#include <QDebug>

// 获取用户信息
bool get_user_data(const QJsonArray &data)
{
    bool json_flag = false;

    qDebug() << QString("data[] size = %1").arg(data.size());

    // 检查数组是否有元素
    if(!data.isEmpty())
    {
        // 遍历数组
        for(const QJsonValue &value : data)
        {
            if(value.isObject())
            {
                // 将数组元素转换为对象
                QJsonObject itemObj = value.toObject();

                // 获取data数据
                int id = itemObj.value("user_id").toInt();
                QString home_name = itemObj.value("home_name").toString();
                QString name = itemObj.value("user_name").toString();
                QString email = itemObj.value("user_email").toString();
                QString status = itemObj.value("user_status").toString();
                QString permission = itemObj.value("user_permission").toString();
                QString created_at = itemObj.value("created_at").toString();


                // 打印输出
                qDebug() << "/t用户ID:" << id
                         << "/t家:" << home_name
                         << "/t用户名:" << name
                         << "/t邮箱:" << email
                         << "/t状态:" << status
                         << "/t读写权限:" << permission
                         << "/t注册时间:" << created_at;
            }
        }
        json_flag = true;
    } else {
        json_flag = true;
    }

    return json_flag;
}

// 获取设备信息
bool get_device_data(const QJsonArray &data)
{
    bool json_flag = false;

    qDebug() << QString("data[] size = %1").arg(data.size());

    // 检查数组是否有元素
    if(!data.isEmpty())
    {
        // 遍历数组
        for(const QJsonValue &value : data)
        {
            if(value.isObject())
            {
                // 将数组元素转换为对象
                QJsonObject itemObj = value.toObject();

                // 获取data数据
                int id = itemObj.value("device_id").toInt();
                QString home_name = itemObj.value("home_name").toString();
                QString name = itemObj.value("device_name").toString();
                QString type = itemObj.value("device_type").toString();
                QString status = itemObj.value("user_status").toString();
                QString created_at = itemObj.value("created_at").toString();


                // 打印输出
                qDebug() << "/t设备ID:" << id
                         << "/t所属家:" << home_name
                         << "/t设备名:" << name
                         << "/t类型:" << type
                         << "/t状态:" << status
                         << "/t注册时间:" << created_at;
            }
        }
        json_flag = true;
    } else {
        json_flag = true;
    }

    return json_flag;
}

// 获取某个家的所有成员用户信息
bool get_home_member_data(const QJsonArray &data)
{
    bool json_flag = false;

    qDebug() << QString("data[] size = %1").arg(data.size());

    // 检查数组是否有元素
    if(!data.isEmpty())
    {
        // 遍历数组
        for(const QJsonValue &value : data)
        {
            if(value.isObject())
            {
                // 将数组元素转换为对象
                QJsonObject itemObj = value.toObject();

                // 获取data数据
                QString home_name = itemObj.value("home_name").toString();

                // 打印输出，当前家名
                qDebug() << "家:" << home_name;
                qDebug() << "成员信息:";

                // 将对象元素转换成数组
                QJsonArray member_data = itemObj.value("users").toArray();

                qDebug() << QString("member_data[] size = %1").arg(data.size());


                // 检查数组是否有元素
                if(!member_data.isEmpty())
                {
                    // 遍历数组
                    for(const QJsonValue &info : member_data)
                    {
                        if(info.isObject())
                        {
                            // 将数组元素转换为对象
                            QJsonObject member_info = info.toObject();

                            // 获取member_data数据
                            int id = member_info.value("user_id").toInt();
                            QString name = member_info.value("user_name").toString();
                            QString email = member_info.value("user_email").toString();
                            QString status = member_info.value("user_status").toString();
                            QString permission = member_info.value("user_permission").toString();


                            // 打印输出
                            qDebug() << "/t用户ID:"  << id
                                     << "/t用户名:"  << name
                                     << "/t邮箱:"    << email
                                     << "/t状态:"    << status
                                     << "/t读写权限:" << permission;

                        }
                    }
                }
            }
        }
        json_flag = true;
    } else {
        json_flag = true;
    }

    return json_flag;
}

// 获取某个家的所有设备信息
bool get_home_device_data(const QJsonArray &data)
{
    bool json_flag = false;

    qDebug() << QString("data[] size = %1").arg(data.size());

    // 检查数组是否有元素
    if(!data.isEmpty())
    {
        // 遍历数组
        for(const QJsonValue &value : data)
        {
            if(value.isObject())
            {
                // 将数组元素转换为对象
                QJsonObject itemObj = value.toObject();

                // 获取data数据
                QString home_name = itemObj.value("home_name").toString();

                // 打印输出，当前家名
                qDebug() << "家:" << home_name;
                qDebug() << "设备信息:";

                // 将对象元素转换成数组
                QJsonArray device_data = itemObj.value("devices").toArray();

                qDebug() << QString("device_data[] size = %1").arg(data.size());


                // 检查数组是否有元素
                if(!device_data.isEmpty())
                {
                    // 遍历数组
                    for(const QJsonValue &device : device_data)
                    {
                        if(device.isObject())
                        {
                            // 将数组元素转换为对象
                            QJsonObject device_info = device.toObject();

                            // 获取device_data数据
                            int id = device_info.value("device_id").toInt();
                            QString name = device_info.value("device_name").toString();
                            QString type = device_info.value("device_type").toString();
                            QString status = device_info.value("device_status").toString();


                            // 打印输出
                            qDebug() << "/t设备ID:" << id
                                     << "/t设备名:" << name
                                     << "/t类型:" << type
                                     << "/t状态:" << status;

                        }
                    }
                }
            }
        }
        json_flag = true;
    } else {
        json_flag = true;
    }

    return json_flag;
}

// 获取某个家的所有设备温湿度数据
bool get_home_sensor_data(const QJsonArray &data)
{
    bool json_flag = false;

    qDebug() << QString("data[] size = %1").arg(data.size());

    // 检查数组是否有元素
    if(!data.isEmpty())
    {
        // 遍历数组
        for(const QJsonValue &value : data)
        {
            if(value.isObject())
            {
                // 将数组元素转换为对象
                QJsonObject itemObj = value.toObject();

                // 获取data数据
                int device = itemObj.value("device_id").toInt();
                QString home_name = itemObj.value("home_name").toString();

                // 打印输出
                qDebug() << "设备ID:" << device;
                qDebug() << "所属家:" << home_name;
                qDebug() << "传感器数据:";

                // 将对象元素转换成数组
                QJsonArray sensor_data = itemObj.value("sensor_data").toArray();

                qDebug() << QString("sensor_data[] size = %1").arg(data.size());


                // 检查数组是否有元素
                if(!sensor_data.isEmpty())
                {
                    // 遍历数组
                    for(const QJsonValue &sensor : sensor_data)
                    {
                        if(sensor.isObject())
                        {
                            // 将数组元素转换为对象
                            QJsonObject sensor_info = sensor.toObject();

                            // 获取sensor_info数据
                            double temperature = sensor_info.value("temperature").toDouble();
                            double humidity = sensor_info.value("humidity").toDouble();
                            QString timestamp = sensor_info.value("timestamp").toString();


                            // 打印输出
                            qDebug() << "/t温度:" << temperature
                                     << "/t湿度:" << humidity
                                     << "/t记录时间:" << timestamp;

                        }
                    }
                }
            }
        }
        json_flag = true;
    } else {
        json_flag = true;
    }

    return json_flag;
}

// 获取某个家的最新温湿度数据
bool get_home_sensor_new_data(const QJsonArray &data)
{
    bool json_flag = false;

    qDebug() << QString("data[] size = %1").arg(data.size());

    // 检查数组是否有元素
    if(!data.isEmpty())
    {
        // 遍历数组
        for(const QJsonValue &value : data)
        {
            if(value.isObject())
            {
                // 将数组元素转换为对象
                QJsonObject itemObj = value.toObject();

                // 获取data数据
                int device_id = itemObj.value("device_id").toInt();
                QString home_name = itemObj.value("home_name").toString();
                QString device_name = itemObj.value("device_name").toString();
                double temperature = itemObj.value("temperature").toDouble();
                double humidity = itemObj.value("humidity").toDouble();
                QString timestamp = itemObj.value("timestamp").toString();

                // 打印输出
                qDebug() << "家:" << home_name
                         << "设备ID:" << device_id
                         << "设备名" << device_name
                         << "/t温度:" << temperature
                         << "/t湿度:" << humidity
                         << "/t记录时间:" << timestamp;
            }
        }
        json_flag = true;
    } else {
        json_flag = true;
    }

    return json_flag;
}


// 解读状态码
QString state_code(int code)
{
    QString code_str = "code: " + QString::number(code) + "\r\n" + "explain: ";
    switch (code)
    {
    case 100:{
        code_str += "服务器接收客户端请求，但没有接收完成";
    }break;
    case 200:{
        code_str += "服务器成功响应本次请求，状态码返回200";
    }break;
    case 300:{
        code_str += "重定向，需要进一步操作完成请求";
    }break;
    case 400:{
        code_str += "客户端请求错误，404：请求路径没有资源，405：请求方法不对";
    }break;
    case 500:{
        code_str += "服务器端出现错误，500：服务器异常";
    }break;
    default: {
        code_str += "还没有该状态码的解释";
    }break;
    }
    return code_str;
}

bool getJsonDatas(const QJsonObject &obj, QString operate)
{
    bool json_flag = true;
    QString codeStr;

    // 打印输出整个Json串
    qDebug() << "rootObj:" << obj;


    // 判断状态码 "code"
    int code = obj.value("code").toInt();
    qDebug() << state_code(code);
    if(code != 200)
    {
        // 失败立即返回
        return json_flag = false;
    }

    // "data[]"
    QJsonArray dataArray = obj.value("data").toArray();

    //    if(dataArray.size() != 0)
    {
        if("最新温湿度数据信息" == operate)
        {
            qDebug() << "get_home_sensor_new_data返回:" << get_home_sensor_new_data(dataArray);
        }
        else if("用户信息" == operate)
        {
            qDebug() << "get_all_user_data返回:" << get_user_data(dataArray);
        }
        else if("设备信息" == operate)
        {
            qDebug() << "get_device_data返回:" << get_device_data(dataArray);
        }
        else if("家中成员信息" == operate)
        {
            qDebug() << "get_home_member_data返回:" << get_home_member_data(dataArray);
        }
        else if("家中设备信息" == operate)
        {
            qDebug() << "get_home_device_data返回:" << get_home_device_data(dataArray);
        }
        else if("家中设备温湿度数据信息" == operate)
        {
            qDebug() << "get_home_sensor_data返回:" << get_home_sensor_data(dataArray);
        } else {
            qDebug() << "data返回:无";
        }
    }

    // "message"
    QString message = obj.value("message").toString();
    qDebug() << "message:" << message;

    return json_flag;
}

void writeJson()
{
    QJsonObject obj;
    obj.insert("Name", "Ace");
    obj.insert("Sex", "man");
    obj.insert("Age", 20);

    QJsonObject subObj;
    subObj.insert("Father", "Gol·D·Roger");
    subObj.insert("Mother", "Portgas·D·Rouge");
    QJsonArray array;
    array.append("Sabo");
    array.append("Monkey D. Luffy");
    subObj.insert("Brother", array);
    obj.insert("Family", subObj);
    obj.insert("IsAlive", false);
    obj.insert("Comment", "yyds");

    QJsonDocument doc(obj);
    QByteArray json = doc.toJson();

    QFile file("d:\\ace.json");
    file.open(QFile::WriteOnly);
    file.write(json);
    file.close();
}

void readJson()
{
    QFile file("d:\\ace.json");
    file.open(QFile::ReadOnly);
    QByteArray json = file.readAll();
    file.close();

    QJsonDocument doc = QJsonDocument::fromJson(json);
    if(doc.isObject())
    {
        QJsonObject obj = doc.object();
        QStringList keys = obj.keys();
        for(int i=0; i<keys.size(); ++i)
        {
            QString key = keys.at(i);
            QJsonValue value = obj.value(key);
            if(value.isBool())
            {
                qDebug() << key << ":" << value.toBool();
            }
            if(value.isString())
            {
                qDebug() << key << ":" << value.toString();
            }
            if(value.isDouble())
            {
                qDebug() << key << ":" << value.toInt();
            }
            if(value.isObject())
            {
                qDebug()<< key << ":";
                // 直接处理内部键值对, 不再进行类型判断的演示
                QJsonObject subObj = value.toObject();
                QStringList ls = subObj.keys();
                for(int i=0; i<ls.size(); ++i)
                {
                    QJsonValue subVal = subObj.value(ls.at(i));
                    if(subVal.isString())
                    {
                        qDebug() << "   " << ls.at(i) << ":" << subVal.toString();
                    }
                    if(subVal.isArray())
                    {
                        QJsonArray array = subVal.toArray();
                        qDebug() << "   " << ls.at(i) << ":";
                        for(int j=0; j<array.size(); ++j)
                        {
                            // 因为知道数组内部全部为字符串, 不再对元素类型进行判断
                            qDebug() << "       " << array[j].toString();
                        }
                    }
                }
            }
        }
    }
}


#endif // MYJSON_H
